package cn.renxuan.querys;

import java.util.Collection;
import java.util.Map;
import java.util.StringJoiner;

import cn.renxuan.repository.DynamicParameters;

/**
 * 数据库基础查询类
 * 
 * @param <TEntity> 实体类型
 */
public class BaseQuery<TEntity> {
    /**
     * 表别名key
     */
    protected String defaultTableAliasKey = "defaultTableAlias";

    /**
     * 是否追加where条件
     */
    protected boolean isAppendFormatWhere = true;

    /**
     * 是否查询列表
     */
    protected Boolean searchList = true;

    /**
     * 是否查询满足条件的总记录数
     */
    protected boolean searchCount = false;

    /**
     * 默认不包含已删除
     */
    protected boolean isContainDeleted = false;

    /**
     * 跳过记录数
     */
    protected Integer skip;

    /**
     * 获取记录数
     */
    protected Integer count;

    /*
     * 
     */
    public Map<String, DynamicParameters> querySql;

    public Map<String, DynamicParameters> getQuerySql() {
        return querySql;
    }

    public void setQuerySql(Map<String, DynamicParameters> querySql) {
        this.querySql = querySql;
    }

    /**
     * 获取表别名key
     * 
     * @return 表别名key
     */
    public String getDefaultTableAliasKey() {
        return defaultTableAliasKey;
    }

    /**
     * 设置表别名key
     * 
     * @param defaultTableAliasKey 表别名key
     */
    public void setDefaultTableAliasKey(String defaultTableAliasKey) {
        this.defaultTableAliasKey = defaultTableAliasKey;
    }

    /**
     * 获取是否追加where条件
     * 
     * @return 是否追加where条件
     */
    public boolean isAppendFormatWhere() {
        return isAppendFormatWhere;
    }

    /**
     * 设置是否追加where条件
     * 
     * @param appendFormatWhere 是否追加where条件
     */
    public void setAppendFormatWhere(boolean appendFormatWhere) {
        isAppendFormatWhere = appendFormatWhere;
    }

    /**
     * 获取是否查询列表
     * 
     * @return 是否查询列表
     */
    public Boolean getSearchList() {
        return searchList;
    }

    /**
     * 设置是否查询列表
     * 
     * @param searchList 是否查询列表
     */
    public void setSearchList(Boolean searchList) {
        this.searchList = searchList;
    }

    /**
     * 获取是否查询统计数
     * 
     * @return 是否查询统计数
     */
    public Boolean getSearchCount() {
        if (this.skip != null && this.skip >= 0 && this.count != null && this.count > 0) {
            searchCount = true;
        }
        return searchCount;
    }

    /**
     * 设置是否查询统计数
     * 
     * @param searchCount 是否查询统计数
     */
    public void setSearchCount(Boolean searchCount) {
        this.searchCount = searchCount;
    }

    /**
     * 设置是否包含已删除记录
     * 
     * @param containDeleted 是否包含已删除记录
     */
    public void setContainDeleted(boolean containDeleted) {
        isContainDeleted = containDeleted;
    }

    /**
     * 获取跳过记录数
     * 
     * @return 跳过记录数
     */
    public Integer getSkip() {
        return skip;
    }

    /**
     * 设置跳过记录数
     * 
     * @param skip 跳过记录数
     */
    public void setSkip(Integer skip) {
        this.skip = skip;
    }

    /**
     * 获取记录数
     * 
     * @return 记录数
     */
    public Integer getCount() {
        return count;
    }

    /**
     * 设置记录数
     * 
     * @param count 记录数
     */
    public void setCount(Integer count) {
        this.count = count;
    }

    protected <TParam> String getCollectionSymbol(Collection<TParam> collection, DynamicParameters parameters,
            String symbol) {
        String retVal = null;
        if (collection == null || collection.isEmpty()) {
            return ""; // 返回空字符串
        }
        StringJoiner joiner = new StringJoiner(",");
        int i = 0;
        for (TParam param : collection) {
            joiner.add("?"); // 使用问号占位符
            parameters.add(symbol + String.valueOf(++i), param);
        }
        retVal = joiner.toString();
        return retVal;
    }
}
